package com.aterrizar.usuario;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.aterrizar.asiento.Asiento;
import com.aterrizar.busqueda.Busqueda;
import com.aterrizar.filtro.Filtro;
import com.aterrizar.sistema.Aterrizar;
import com.aterrizar.tipoUsuario.TipoUsuario;

public class Usuario {

	private List<Busqueda> busquedas;
	private TipoUsuario tipoUsuario;
	private String dni;

	private List<Asiento> reservas;
	private List<Asiento> compras;

	public void agregarReserva(Asiento asiento) {
		if(null == reservas) reservas = new ArrayList<Asiento>();
		reservas.add(asiento);
	}
	
	public void agregarCompra(Asiento asiento) {
		if(null == compras) compras = new ArrayList<Asiento>();
		compras.add(asiento);
	}

	public List<Asiento> buscar(String origen, String destino, String fecha,
			String horaSalida, String horaLlegada, List<Filtro> filtros,
			Comparator<Asiento> criterio, boolean conReservas) {

		List<Asiento> asientos = tipoUsuario.buscar(this, origen, destino,
				fecha, horaSalida, horaLlegada);
		Busqueda nuevaBusqueda = new Busqueda(origen, destino, fecha,
				horaSalida, horaLlegada);
		busquedas.add(nuevaBusqueda);

		if (conReservas) {
			asientos.addAll(Aterrizar.getInstance()
					.encontrarAsientosEnReservas(origen, destino, fecha,
							horaSalida, horaLlegada));
		}
		if (null != filtros) {
			for (Filtro filtro : filtros) {
				asientos = filtro.filtrar(asientos);
			}
		}
		if (null != criterio)
			Collections.sort(asientos, criterio);
		return asientos;

	}

	public void comprar(Asiento asiento) {
		tipoUsuario.comprar(this, asiento);
	}

	public void reservar(Asiento asiento) {
		tipoUsuario.reservar(this, asiento);
	}

	public Usuario(TipoUsuario tipoUsuario) {
		setTipoUsuario(tipoUsuario);
		busquedas = new ArrayList<Busqueda>();
	}

	public TipoUsuario getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(TipoUsuario tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	public List<Busqueda> getBusquedas() {
		return busquedas;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public List<Asiento> getReservas() {
		return reservas;
	}

	public void setReservas(List<Asiento> reservas) {
		this.reservas = reservas;
	}

	public List<Asiento> getCompras() {
		return compras;
	}

	public void setCompras(List<Asiento> compras) {
		this.compras = compras;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((dni == null) ? 0 : dni.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (dni == null) {
			if (other.dni != null)
				return false;
		} else if (!dni.equals(other.dni))
			return false;
		return true;
	}

	public void sobreReservar(Asiento asiento) {
		this.tipoUsuario.sobreReservar(this, asiento);
	}

}
